*
* Valores por extenso
* Desenvolvida por Antonio Carlos
*
*
* Exemplos de funcionamento da funcao
*
* Basta compilar
*

/*
clear

aNumero = 123456789.12
? aNumero
aExt = fextenso(aNumero,60,'*',1,1,'(',')')
aCont = 1
do while aCont <= len(aExt)
   ? aExt[aCont]
   ACont++
enddo
?
inkey(10)

aNumero = 987654321.98
? aNumero
aExt = fextenso(aNumero,40,'*',2,2,'{','}')
aCont = 1
do while aCont <= len(aExt)
   ? aExt[aCont]
   ACont++
enddo
?
inkey(10)

aNumero = 12321.99
? aNumero
aExt = fextenso(aNumero,20,'#')
aCont = 1
do while aCont <= len(aExt)
   ? aExt[aCont]
   ACont++
enddo
?
inkey(10)

aNumero = 999999999.99
? aNumero
aExt = fextenso(aNumero,30)
aCont = 1
do while aCont <= len(aExt)
   ? aExt[aCont]
   ACont++
enddo
?
inkey(10)

return
*/



Clear

nValor := 0

@ 00,00 say "Valor :" Get nValor Picture "@e 999,999,999.99"
Read

@ 02,00 say "Valor: "+ transform(nValor,"@e999,999,999.99")

*aExt = fextenso(nValor,30)
?
aExt = fextenso(nValor,40,'*',2,1,'{','}')
aCont = 1
do while aCont <= len(aExt)
   ? aExt[aCont]
   ACont++
enddo
?
? aExt
return


*
* Depois de rodar altere os valores e a configuracao voce vai gostar
*

*
* Funcao para conversao de valores por extenso
* Desenvolvida por Antonio Carlos
*
* aNumero    Numero a ser transformado
* aColunas   Define a quantidade de colunas das linhas
* aPreenche  Define o caracter que vai preencher as sobras em branco da linha
* aTipo      (1) preenche sem justificar (2) preenche justificando
* aUpper     (1) minusculo (2) maiusculo
* aAbre      Define o caracter de abertura da macro exp : '(' - '(Cem reais)'
* aFecha     Idem ao item de cima mas para o fechamento
*
* Retorna matriz array com quantidade de linhas necessarias para texto
*

Function fextenso(aNumero, aColunas, aPreenche, aTipo, aUpper, aAbre, aFecha)
local aMil, aMilhao, aMilhoes, aMoeda, aMoeda1, aCentavo, aCentavos, aCents
local alinha[0]
local aPos, aContador, aFinal, aDezena, aContLin, aExtenso

if aAbre = nil
   aAbre = ''
endif

if aFecha = nil
   aFecha = ''
endif

if aUpper = nil
   aUpper = 1
endif

if aTipo = nil
   aTipo = 1
endif

if aPreenche = nil
   aPreenche = '*'
endif

if aColunas = nil
   aColunas = 60
endif

if aNumero = nil
   return({space(aColunas)})
endif

if aNumero = 0
   return({space(aColunas)})
endif

n00=' '
n01='UM '
n02='DOIS '
n03='TRES '
n04='QUATRO '
n05='CINCO '
n06='SEIS '
n07='SETE '
n08='OITO '
n09='NOVE '
n10='DEZ '
n11='ONZE '
n12='DOZE '
n13='TREZE '
n14='QUATORZE '
n15='QUINZE '
n16='DEZESSEIS '
n17='DEZESSETE '
n18='DEZOITO '
n19='DEZENOVE '
n20='VINTE '
n30='TRINTA '
n40='QUARENTA '
n50='CINQUENTA '
n60='SESSENTA '
n70='SETENTA '
n80='OITENTA '
n90='NOVENTA '
n000=' '
n100='CENTO '
n200='DUZENTOS '
n300='TREZENTOS '
n400='QUATROCENTOS '
n500='QUINHENTOS '
n600='SEISCENTOS '
n700='SETECENTOS '
n800='OITOCENTOS '
n900='NOVECENTOS '

aMil='MIL '
aMilhao='MILHAO '
aMilhoes='MILHOES '
aMoeda='REAIS '
aMoeda1='REAL '
aCentavo='CENTAVO'
aCentavos='CENTAVOS'

aNumero1 = str(aNumero,13,2)
aCents    = str((aNumero-int (aNumero))*100,2)
aNumero  = int(aNumero)
aContador = 1

aPart1=substr(aNumero1,2,3)
aPart2=substr(aNumero1,5,3)
aPart3=substr(aNumero1,8,3)
aPart4=aCents

aTextoExt1=''
aTextoExt2=''
aTextoExt3=''
aTextoExt4=''

if val (aPart1) >0
    aStatus1= iif (val (aPart1) >1,'2','1')
else
    aStatus1=' '
endif

do while aContador <=4
   aItem=str (aContador,1)
   aGrupo= 'aPart'+str (aContador,1)
   aExtenso=iif (&aGrupo='000','',ltrim(&aGrupo))

   do case

      case len (aExtenso)=3

         if aExtenso='100'
            aTextoExt&aItem=aTextoExt&aItem+'CEM '
            aContador=aContador+1
            loop
         endif

         if right (aExtenso,2)='00'
            aTab='n'+substr(aExtenso,1,1)+'00'
            aTextoExt&aItem=aTextoExt&aItem+&aTab
            aContador=aContador+1
            loop
         endif

         aTab='n'+left(aExtenso,1)+'00'
         aTextoExt&aItem=&aTab +'E '
         aDezena=val(right(aExtenso,2))

         if aDezena <20
            aTab='n'+right(aExtenso,2)
            aTextoExt&aItem=aTextoExt&aItem+&aTab
            aContador=aContador+1
            loop
         else
            aTab='n'+substr(aExtenso,2,1)+'0'
            aTextoExt&aItem=aTextoExt&aItem+&aTab
            aTab='n0'+right (aExtenso,1)
            unidade=val(right (aExtenso,1))

            if unidade > 0
               aTextoExt&aItem=aTextoExt&aItem +iif (val(aExtenso)>10,'E ','')
            endif

            aTextoExt&aItem=aTextoExt&aItem+iif(aTab='n00',' ',&aTab)
         endif

      case len(aExtenso)=2

         aDezena=val(right(aExtenso,2))

         if aDezena < 20
            aTab='n' + right(aExtenso,2)
            aTextoExt&aItem=aTextoExt&aItem+&aTab
            aContador=aContador+1
            loop
         else
            aTab='n'+ substr(aExtenso,1,1)+'0'
            aTextoExt&aItem=aTextoExt&aItem + &aTab
            aTab='n0' + right (aExtenso,1)
            unidade1=val (right(aExtenso,1))

            if unidade1 > 0
               aTextoExt&aItem=aTextoExt&aItem+'E '
            endif

            aTextoExt&aItem=aTextoExt&aItem+iif (aTab='n00',' ',&aTab)
         endif

      case len(aExtenso)=1

         aTab='n0' + right(aExtenso,1)
         aTextoExt&aItem=aTextoExt&aItem + iif(aTab='n00',' ',&aTab)

      otherwise

         aTextoExt&aItem=''

   endcase

   aContador=aContador+1
enddo

if val (aPart1+aPart2+aPart3)=0 .and. val(aPart4)#0
   aFinal=aTextoExt4+(iif (val (aPart4)=1,aCentavo,aCentavos))
endif

if val(aPart1+aPart2+aPart3)#0
   aFinal= iif (len(aTextoExt1)=0,'',aTextoExt1 +iif (aStatus1='1',aMilhao, aMilhoes))+    iif(len(aTextoExt2)=0,'',   aTextoExt2+aMil)  + aTextoExt3 +iif(val(aPart2+aPart3)=0 ,'de ','')
   aFinal= aFinal+ iif(val (aPart1+aPart2+aPart3)=0 ,'',iif(val (aPart1+aPart2+aPart3)=1, aMoeda1,aMoeda))
   aFinal= aFinal+ iif(val (aPart4)=0,'',iif(val(aPart1+aPart2+aPart3)=0,'','E ') + aTextoExt4 + (iif(val(aPart4)=1,aCentavo,aCentavos)))
endif

if aUpper = 1
   aFinal = substr(aFinal,1,1)+lower(substr(aFinal,2))
endif

aFinal = aAbre+alltrim(aFinal)+aFecha

do while len(aFinal) > aColunas
   aPos = aColunas+1
   do while substr(aFinal,aPos,1) <> " "
      aPos--
   enddo
   aadd(alinha,alltrim(substr(aFinal,1,aPos)))
   aFinal = alltrim(substr(aFinal,aPos))
enddo

aadd(alinha,alltrim(aFinal))

if aTipo > 1
   aContLin = 1
   do while aContLin < len(alinha)
      alinha[aContLin] := fjustifica(alinha[aContLin],aColunas)
      aContLin++
   enddo
endif

aContLin = 1
do while aContLin <= len(alinha)
   alinha[aContLin] := alinha[aContLin]+replicate(aPreenche,aColunas-len(alinha[aContLin]))
   aContLin++
enddo

return(aLinha)



*
* Funcao para justificar textos
* Desenvolvida por Antonio Carlos
*
* aTexto   Linha de texto a ser justificada
* aColunas Numero de colunas desejavel
*
* Retorna o texto justificado de acordo com o numero de colunas

Function fjustifica(aTexto, aColunas)
local aPos

aTexto := alltrim(aTexto)

if len(aTexto) >= aColunas
   return(aTexto)
endif

do while .t.
   aPos = len(aTexto)
   do while aPos > 1
      do while substr(aTexto,aPos,1) <> " "
         aPos--
      enddo
      do while substr(aTexto,aPos,1) = " "
         aPos--
      enddo
      aTexto := substr(aTexto,1,aPos)+' '+substr(aTexto,aPos+1)
      if len(aTexto) = aColunas
         exit
      endif
   enddo
   if len(aTexto) = aColunas
      exit
   endif
enddo
return(aTexto)
